package com.qdlc.p2p.dal.model.interest;

import java.util.Date;
import java.util.List;

import com.google.common.collect.Lists;
import com.qdlc.p2p.common.util.BigDecimalUtil;
import com.qdlc.p2p.common.util.DateUtil;

/**
 * 一次性还款利息计算函数
 *
 * @version 1.1.0.0
 * @author:wuaj
 */
public class OnetimeRepaymentCalculator implements InterestCalculator {

    /** 借款金额 */
    private double account;

    /** 年利率 */
    private double yearApr;

    /** 利息管理费 */
    private double manageFee;

    /** 期数 */
    private int periods;

    /** 还款金额 */
    private double repayAccount;

    /** 开始计息日 */
    private Date interestTime;

    /** 还款日 */
    private Date repayTime;

    /** 还款计划 */
    private List<EachPlan> eachPlanList;

    /**
     * 初始化一次性还款构造函数
     *
     * @param account      借款总额
     * @param yearApr      年利率
     * @param interestTime 开始计息日
     * @param periods      期数即月数
     * @param manageFee    利息管理费
     */
    public OnetimeRepaymentCalculator(double account, double yearApr, Date interestTime,
                                      int periods, double manageFee) {
        super();
        this.account = account;
        this.yearApr = yearApr;
        this.manageFee = manageFee;
        this.periods = periods; // 期数即月数
        this.interestTime = interestTime;
        //eachPlanList = new ArrayList<EachPlan>();
    }

    @Override
    public List<EachPlan> calculator() {
        double monthApr = BigDecimalUtil.div(yearApr, 12); // 月利率
        // 根据月数计算利息(总金额 * 月利率 * 期数/月数)
        double interest = BigDecimalUtil.round(BigDecimalUtil.mul(account, monthApr, periods), 2);

        eachPlanList = Lists.newArrayList();
        this.repayTime = DateUtil.rollMon(interestTime, periods); // 还款时间
        eachPlanList.add(createEachPlan(interest, this.repayTime));
        return eachPlanList;
    }

    @Override
    public List<EachPlan> calculator(int days) {
        double dayApr = BigDecimalUtil.div(yearApr, 365); // 天利率
        // 根据天数计算利息
        double interest = BigDecimalUtil.round(BigDecimalUtil.mul(dayApr, account, days), 2);

        eachPlanList = Lists.newArrayList();
        this.repayTime = DateUtil.rollDay(interestTime, days); // 还款时间
        eachPlanList.add(createEachPlan(interest, this.repayTime));
        return eachPlanList;
    }

    private EachPlan createEachPlan(double interest, Date repayTime) {
        EachPlan eachPlan = new EachPlan();
        eachPlan.setCapital(account); // 本金
        eachPlan.setInterest(interest); // 利息

        // 净利息 = 利息 * (1 - 管理费率)
        double netInterest = BigDecimalUtil.round(BigDecimalUtil.mul(interest, BigDecimalUtil.sub(1, manageFee)), 2);
        eachPlan.setNetInterest(netInterest);

        // 总金额 = 本金 + 利息
        double total = BigDecimalUtil.round(BigDecimalUtil.add(account, interest), 2);
        eachPlan.setTotal(total);

        // 净总金额 = 本金 + 净利息
        double netTotal = BigDecimalUtil.add(account, netInterest);
        eachPlan.setNetTotal(netTotal);

        eachPlan.setInterestTime(interestTime);// 开始计算日
        eachPlan.setRepayTime(repayTime); // 还款时间

        this.repayAccount = eachPlan.getTotal(); // 总金额
        return eachPlan;
    }

    @Override
    public List<EachPlan> getEachPlanList() {
        return eachPlanList;
    }

    @Override
    public double repayTotal() {
        return repayAccount;
    }

    @Override
    public Date calculatorRepayTime(Date date, int i) {
        return null;
    }

    @Override
    public Date repayTime() {
        return repayTime;
    }
}
